package gestionmagasins_aspectj_junit_patterns.model;

import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Vincent
 */
public class Vente {
    
    private Date date;
    private double total;
    private double sousTotal;
    private double taxes;
    private ArrayList<Paiement> listePaiements;
    private ArrayList<Article> listeArticles;
    private Client client;
    private Usager vendeur;
    private EtatsVente etat;
    
    public Vente() {
        this.listeArticles = new ArrayList<>();
        this.listePaiements = new ArrayList<>();
    }
    
    public Vente(Date date, Client client, Usager vendeur) {
        this.date = date;
        this.client = client;
        this.vendeur = vendeur;
        this.listePaiements = new ArrayList<>();
        this.listeArticles = new ArrayList<Article>();
    }
    
    /**
     * @return the date
     */
    public Date getDate() {
        return date;
    }

    /**
     * @param date the date to set
     */
    public void setDate(Date date) {
        this.date = date;
    }

    /**
     * @return the total
     */
    public double getTotal() {
        return this.getSousTotal() + this.getTaxes();
    }

    /**
     * @return the sousTotal
     */
    public double getSousTotal() {
        
        this.sousTotal = 0;
        for(Article a : this.getListeArticles())
            this.sousTotal += a.getPrix();

        return this.sousTotal;
    }
    
    /**
     * @return the taxes
     */
    public double getTaxes() {
        this.taxes = 0;
        for(Article a : this.getListeArticles())
            for(Taxe t : a.getTaxes())
                this.taxes += a.getPrix() * t.getTauxCourant();
        
        return this.taxes;
    }

    /**
     * @return the listePaiements
     */
    public ArrayList<Paiement> getListePaiements() {
        return listePaiements;
    }

    /**
     * @param listePaiements the paiementList to set
     */
    public void setListePaiement(ArrayList<Paiement> listePaiements) {
        this.listePaiements = listePaiements;
    }
    
    /**
     * 
     * @param paiement le paiement à ajouter
     */
    public void ajouterPaiement(Paiement paiement)
    {
        if(!listePaiements.contains(paiement))
        {
            this.listePaiements.add(paiement);
        }
        
    }

    /**
     * 
     * @param paiement le paiement à enlever
     */
    public void suprimmerPaiement(Paiement paiement)
    {
        if(listePaiements.contains(paiement))
            this.listePaiements.remove(paiement);
    }
    
    /**
     * @return the client
     */
    public Client getClient() {
        return client;
    }

    /**
     * @param client the client to set
     */
    public void setClient(Client client) {
        this.client = client;
    }

    /**
     * @return the vendeur
     */
    public Usager getVendeur() {
        return vendeur;
    }

    /**
     * @param vendeur the vendeur to set
     */
    public void setVendeur(Usager vendeur) {
        this.vendeur = vendeur;
    }

    /**
     * @return the etat
     */
    public EtatsVente getEtat() {
        return etat;
    }

    /**
     * @param etat the etat to set
     */
    public void setEtat(EtatsVente etat) {
        this.etat = etat;
    }
    
    /**
     * @return the listeArticles
     */
    public ArrayList<Article> getListeArticles() {
        return listeArticles;
    }
    
    /**
     * @param listeArticles the listeArticles to set
     */
    public void setListeArticles(ArrayList<Article> listeArticles) {
        this.listeArticles = listeArticles;
    }

    /**
     * @param article the article to add
     */
    public void ajouterArticle(Article article) {
        this.listeArticles.add(article);
    }
    
    public void supprimerArticle(Article article) {
        this.listeArticles.remove(article);
    }
    
    public boolean matches(String criteria) 
    {
        criteria = criteria.toLowerCase();
        
        return (   date.toString().contains(criteria) 
                || vendeur.matches(criteria));
    }
    
    @Override
    public String toString()
    {
        return this.date + " " + this.vendeur.getFirstname() + " " + this.getTotal();
    }

    public enum EtatsVente {
        Ouverte,
        AttenteDePaiement,
        Complétée,
        Fermée
    }
}
